home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / mac / files / infodata / callbook.tar / callbook_1.3 / filter.c < prev    next >
C/C++ Source or Header  |  1990-07-17  |  2KB  |  125 lines

  1. /*
  2.  * Telnet callsign server sources copyright 1989 by Devon Bowen, KA2NRC.
  3.  * You may distribute and modify these files as you please as long as
  4.  * as long as credit to the original creator is given. Please report any
  5.  * bug fixes or modification to bowen@cs.buffalo.edu.
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <regexp.h>
  10.  
  11. char *param(), *malloc(), *index();
  12.  
  13. struct filttype {
  14.     char option;
  15.     int index;
  16.     char *str;
  17.     regexp *expr;
  18.  
  19. } filt[] = {
  20.         { 'c',  0, NULL, NULL },
  21.         { 'l',  1, NULL, NULL },
  22.         { 'f',  3, NULL, NULL },
  23.         { 'a',  8, NULL, NULL },
  24.         { 't',  9, NULL, NULL },
  25.         { 's', 10, NULL, NULL },
  26.         { 'z', 11, NULL, NULL },
  27.         { ' ',  0, NULL, NULL }
  28.        };
  29.  
  30.  
  31. filtsetup(cmd)
  32. char *cmd;
  33. {
  34.     char *reg;
  35.     int maxnum, cnt, cnt2;
  36.  
  37.     for (cnt=0; filt[cnt].option != ' '; cnt++) {
  38.  
  39.         if (filt[cnt].str != NULL) {
  40.             free(filt[cnt].str);
  41.             filt[cnt].str = NULL;
  42.         }
  43.  
  44.         if (filt[cnt].expr != NULL) {
  45.             free(filt[cnt].expr);
  46.             filt[cnt].expr = NULL;
  47.         }
  48.     }
  49.  
  50.     maxnum = paramnum(cmd);
  51.  
  52.     for (cnt=1; cnt < maxnum; cnt++) {
  53.         char *field;
  54.  
  55.         field = param(cmd, cnt);
  56.  
  57.         if (*field == '-' && *(field+2) == '\0') {
  58.  
  59.             for (cnt2=0; filt[cnt2].option != ' '; cnt2++)
  60.  
  61.                 if (filt[cnt2].option == *(field+1)) {
  62.  
  63.                     if (filt[cnt2].str != NULL) {
  64.                         tputs("Duplicate filter\n", 0);
  65.                         return 1;
  66.                     }
  67.  
  68.                     reg = param(cmd, cnt+1);
  69.                     if (reg == NULL) {
  70.                         tputs("Bad filter param\n", 0);
  71.                         return 1;
  72.                     }
  73.  
  74.                     filt[cnt2].str = malloc(strlen(reg)+1);
  75.                     strcasecpy(filt[cnt2].str, reg);
  76.  
  77.                     filt[cnt2].expr=regcomp(filt[cnt2].str);
  78.  
  79.                     if (filt[cnt2].expr == NULL) {
  80.                         tputs("Bad expression\n", 0);
  81.                         return 1;
  82.                     }
  83.  
  84.                     cnt++;
  85.  
  86.                     break;
  87.                 }
  88.  
  89.             if (filt[cnt2].option == ' ') {
  90.                 tputs("Bad filter\n", 0);
  91.                 return 1;
  92.             }
  93.         }
  94.     }
  95.  
  96.     return 0;
  97. }
  98.  
  99.  
  100. filter(data)
  101. char *data;
  102. {
  103.     int cnt;
  104.     char *fields[19];
  105.     char locbuf[BUFSIZ];
  106.  
  107.     strcpy(locbuf, data);
  108.     
  109.     fields[0] = locbuf;
  110.  
  111.     for (cnt=1; cnt<19; cnt++) {
  112.         fields[cnt] = index(fields[cnt-1], '|');
  113.         *(fields[cnt]++) = '\0';
  114.     }
  115.  
  116.     for (cnt=0; filt[cnt].option != ' '; cnt++) {
  117.  
  118.         if (filt[cnt].str != NULL && !regexec(filt[cnt].expr,
  119.                         fields[filt[cnt].index]))
  120.             return 0;
  121.     }
  122.  
  123.     return 1;
  124. }
  125.